#ifndef _MOTOR_H_
#define _MOTOR_H_
#include "stdint.h"
#include "IT_Callback.h"

#define LEFT_FRONT_CHANGE_DIRECTION 0
#define LEFT_BACK_CHANGE_DIRECTION 0
#define RIGHT_FRONT_CHANGE_DIRECTION 0
#define RIGHT_BACK_CHANGE_DIRECTION 0

#define LEFT_TIM_HANDLE htim4
#define LEFT_FRONT_TIM_CHANNEL_1 TIM_CHANNEL_3
#define LEFT_FRONT_TIM_CHANNEL_2 TIM_CHANNEL_4
#define LEFT_BACK_TIM_CHANNEL_1 TIM_CHANNEL_1
#define LEFT_BACK_TIM_CHANNEL_2 TIM_CHANNEL_2

#define RIGHT_TIM_HANDLE htim8
#define RIGHT_FRONT_TIM_CHANNEL_1 TIM_CHANNEL_3
#define RIGHT_FRONT_TIM_CHANNEL_2 TIM_CHANNEL_4
#define RIGHT_BACK_TIM_CHANNEL_1 TIM_CHANNEL_1
#define RIGHT_BACK_TIM_CHANNEL_2 TIM_CHANNEL_2

#define LEFT_FRONT_ENCODER_TIM_HANDLE htim1
#define LEFT_BACK_ENCODER_TIM_HANDLE htim2
#define RIGHT_FRONT_ENCODER_TIM_HANDLE htim3
#define RIGHT_BACK_ENCODER_TIM_HANDLE htim5
typedef struct {
    int16_t leftSpeed;          //设定的左轮速度,用于固定转速模式，单位为每0.1s的编码器脉冲数
    int16_t rightSpeed;         //设定的右轮速度,用于固定转速模式，单位为每0.1s的编码器脉冲数
    int16_t encoderLeftFront;   //左前轮编码器
    int16_t encoderLeftBack;    //左后轮编码器
    int16_t encoderRightFront;  //右前轮编码器
    int16_t encoderRightBack;   //右后轮编码器
    int32_t encoderDistance;    //编码器距离
}motorSpeedTypeDef;//单例模式，用于存储4个电机速度，只有一个实例对象
enum MotorMode
{
    MOTOR_MODE_Direct = 0,
    MOTOR_MODE_SPEED = 1,
};
// /*记录当前左右电机的PWM值*/
// typedef struct{
	
// 	int leftPWM;
// 	int rightPWM;

// }motorPWMTypeDef;

// extern motorPWMTypeDef gl_motorPWM;
extern motorSpeedTypeDef gl_motor;//全局变量，用于存储4个电机速度，只有一个实例对象
extern Observer MotorPIDAdjustObserver;//电机PID调节观察者，会在定时器6中断中调用，但是要把Update函数改成自己想要的功能

void MotorInit(void);//电机初始化
void resetMotorSpeedValue_runTime(int16_t leftSpeed, int16_t rightSpeed);//重置电机速度值，用于运行时改变电机速度
void speedAdjustment(int16_t leftPWM, int16_t rightPWM);//用于对旧代码的支持，直接设置电机的速度
void positionSpeedOut(int leftSpeed, int rightSpeed, int dSpeed);//调整左右速度差
void motorStop();//电机停止
void motorRunModeChange(enum MotorMode mode);
enum MotorMode getMotorRunMode();
// 电机运行模式改变
//  位置式PID，用于对旧代码的支持，直接设置电机的速度
void EncoderInit(void);//编码器初始化
#endif  // !_MOTOR_H_
